#include <my_header.h>
// mmap映射接收数据
/* Usage:  */
int main(void){                                  
    char *ip = "192.168.229.128";
    char *port = "8080";

    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    ERROR_CHECK(socket_fd, -1, "socket");

    struct sockaddr_in sockaddr;
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = htons(atoi(port));
    sockaddr.sin_addr.s_addr = inet_addr(ip);

    int res_conn = connect(socket_fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
    ERROR_CHECK(res_conn, -1, "connect");
    // 信息在应用层有边界
    // 接收文件名的长度  
    int file_name_len;  
    recv(socket_fd, &file_name_len, sizeof(int), 0); // 接收文件名长度  

    char file_name[60] = {0}; // 文件名缓冲区  
    recv(socket_fd, file_name, file_name_len, 0); // 根据长度接收文件名  

    // 创建文件并打开  
    int file_fd = open(file_name, O_RDWR | O_CREAT, 0600); // 以读写模式创建文件，权限为0600  

    // 接收文件大小
    off_t file_size = 0;
    recv(socket_fd, &file_size, sizeof(off_t), MSG_WAITALL);
    printf("client: file_size: %ld \n", file_size);

    // 首先在mmap之前调整文件大小, 让文件足够大
    ftruncate(file_fd, file_size);

    // 接收数据
    void *p = mmap(NULL, file_size, PROT_READ|PROT_WRITE, MAP_SHARED, file_fd, 0);

    recv(socket_fd, p, file_size, MSG_WAITALL);

    munmap(p, file_size);

    close(file_fd);
    close(socket_fd);
    return 0;
}

